package com.chenxys.algorithm.newbie;

/**
 * <p>
 *      选择排序
 *          0~n-1上选出最小值放在0位置
 *          1~n-1上选出最小值放在1位置
 *          2~n-1上选出最小值放在2位置
 *          ...
 * </p>
 *
 * @author Chenxys
 * @version V1.0
 * @Package com.chenxys.algorithm.newbie
 * @date 12/24/23 4:33 PM
 * @Copyright ©
 */
public class SelectionSort {
    /**
     * <p>
     *     选择排序
     * </p>
     * @param arr 无序数组
     */
    public static void selectSort(int[] arr){
        if (arr == null || arr.length < 2){
            return;
        }
        int n = arr.length;
        // 0 ~ n-1
        // 1 ~ n-1
        for (int i = 0; i < n; i++) {
            // i ~ n-1
            int minValueIndex = i;// 将最小值设为i位置的数
            for (int j = i + 1; j < n; j++) {
                // 如果下一位的数更小，则更新最小值位置
                minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;
            }
            // 交换
            swap(arr, i, minValueIndex);
        }
    }

    /**
     * <p>
     *     交换数组中元素顺序
     * </p>
     * @param arr 数组
     * @param i 位置1
     * @param j 位置2
     */
    public static void swap(int[] arr, int i , int j){
        int tmp = arr[j];
        arr[j] = arr[i];
        arr[i] = tmp;
    }

    /**
     * <p>
     *     打印数组
     * </p>
     * @param arr 无序数组
     */
    public static void printArr(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    } 

    public static void main(String[] args) {
        int[] arr = {7, 1, 3, 5, 1, 6, 8, 1, 3, 5, 7, 5, 6};
        printArr(arr);
        selectSort(arr);
        printArr(arr);
    }
}
